iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0

昨天我們快速建立了我們的第一個後端 (其中包含了一支 API),現在讓我們來仔細看一下 main.py 的內容到底在做什麼。等到理解它背後的邏輯之後,就可以開始嘗試修改了~

main.py 到底設定了什麼?

先來仔細看一下這部分

@app.get("/")
async def root():
    return {"message": "Hello World"}

上面這段程式翻成中文就是

當我們的 app (FastAPI 物件) 收到「HTTP 方法為 GET」且「路由為 "/"」的請求時,以異步的方式執行 root 函數,而這個 root 函數會回傳內容為 {"message": "Hello World"} 的回應給前端

哇!好多新名詞...
confuse

讓我們來簡單地解釋一下 (順序有稍微調整過,比較方便理解)

請求、回應

當使用者透過瀏覽器進入某個網址時,就是向網頁的伺服器發出一個「請求」(Request),伺服器收到請求後,就會回傳一個「回應」(Response)。而這個回應通常會是一個 HTML 格式的內容,瀏覽器就會把它呈現在畫面上。

若要描述精確一點的話,這邊應該是 HTTP 請求、HTTP 回應,但這邊就以最常見的 HTTP 為主,所以就把 HTTP 省略掉不寫

HTTP 方法

使用者在發送請求時,除了要指定位置 (例如:網址) 之外,也要指定他要使用哪種 HTTP 方法。如果是單純使用瀏覽器瀏覽網站的話,就會是使用 GET,通常是在想要取得某些資料時會使用它,例如:請求網頁、進行搜尋。其他方法 (例如:POST、DELETE) 則通常是有其他目的才會使用到,例如:新增資料、刪除資料。

可以參考這份官方文件,它有列出並說明各個方法的意義。

路由

在介紹路由 (Route) 之前,我們先來看一下網址下面這個網址
https://ithelp.ithome.com.tw/users/20162280/ironman/6767

可以簡單地分成三個部分

  1. 協定:https
  2. 網域:ithelp.ithome.com.tw
  3. 路由:/users/20162280/ironman/6767

簡單來說,路由就是負責區分各個功能位置,讓後端可以根據位置找到對應的程式,來進行它應該要做的事情

異步

一般程式碼在執行的時候,會一行一行的執行,一次只處理一件事情。但如果後端一次只處理一個請求,後續的請求都必須等前面的請求處理好才能開始,就會造成大塞車

就像在點餐時,櫃檯只有一個人,但排隊的隊伍大排長龍

因此,透過設定異步處理,就能讓後端同時處理多個請求,減少等待時間

就像多了好幾個點餐櫃檯

FastAPI 官網對此有很詳細的圖文介紹,我個人覺得寫得很好,歡迎大家去看看XD

回顧整個操作流程

知道 main.py 在設定了什麼後,接下來讓我們重新思考一下我們做了什麼才看到 {"message": "Hello World"}

操作流程

首先,我們打開了瀏覽器,輸入網址 http://127.0.0.1:8000 後送出,之後就看到 {"message": "Hello World"}

背後邏輯

當我們打開瀏覽器,輸入 http://127.0.0.1:8000 並送出後,瀏覽器向後端送出 GET 請求,後端比對後發現,有符合它的路由設定,對應的是 root 函數,而這個函數的回應是 {"message": "Hello World"},瀏覽器收到回應後,把它呈現在畫面上。

以上,這就是為什麼我們進到 http://127.0.0.1:8000 後,會看到 {"message": "Hello World"} 的原因了

修改 main.py 設定

走過整個基本的流程之後,再來就是看怎麼修改設定了

再看一次這段程式

@app.get("/")
async def root():
    return {"message": "Hello World"}

設定 HTTP 方法

只要把 get 換成其他方法就好,例如:postdeleteput

@app.delete("/")
async def root():
    return {"message": "You deleted something!"}

但這邊沒辦法靠瀏覽器去觸發 GET 以外的方法,會在後續文章介紹怎麼測試上面這段程式

設定路由

/ 換成其他路徑即可

@app.get("/users/20162280/ironman/6767")
async def root():
    return {"message": "Hi user~"}

此時,重新啟動程式後,並進入 http://127.0.0.1:8000/users/20162280/ironman/6767 就可以看到剛剛改動的結果

hi user

此外,也可以發現原本的網址 http://127.0.0.1:8000 的畫面則變成這樣
not found

這是因為後端找不到這個位置對應的要執行的程式 (因為沒設定,被我們改掉了),就會回傳這個預設的錯誤訊息給前端

設定動態路由

但有的時候,我們的網址希望這個路由其中一部分不用是固定的 (例如:商品編號),但都做一樣的處理,則可以這樣設定

@app.get("/users/{user_id}")
async def root(user_id):
    return {"message": f"Hi user {user_id}"}

8964

重點整理

今天就先介紹到這邊,上面我們介紹了

  1. main.py 內的程式內容
  2. 瀏覽器看到訊息的背後邏輯
  3. 如何修改路由

明天會開始介紹應該要怎麼設計路由~

文章怎麼越寫越長了...
/images/emoticon/emoticon06.gif


上一篇
[Day 02] 第一個 FastAPI 程式
下一篇
[Day 04] 路由設計:RESTful API
系列文
FastAPI 開發筆記:從新手到專家的成長之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言